package djrain.lib;

import android.content.Context;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.util.Log;

public class GpsHelper implements LocationListener {
	private static final String tag = "LocationHelper";
	private String bestProvider;
	private LocationManager locationManager;

	private OnLocationChangeListener listener;

	private Location location;
	private String gpsProvider;

	static long MINTIME = 3000;
	static float MINDISTANCE = 0f;
	static float SPEED_UNIT = 1f;


	static public interface OnLocationChangeListener
	{
		public void onLocationChanged(Location location);
	}

	void setOnLocationChangeListener(OnLocationChangeListener listener)
	{
		this.listener = listener;
	}

	public Location getLocation()
	{
		return location;
	}

	public GpsHelper(Context context)
	{
		locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
		findBestProvider();
	}

	public void findBestProvider()
	{
		// if(bestProvider != null &&
		// locationManager.isProviderEnabled(bestProvider)){
		// }

		Criteria criteria = new Criteria();
		bestProvider = locationManager.getBestProvider(criteria, false);
		location = locationManager.getLastKnownLocation(bestProvider);
		Log.e("Lilo", "find best provider:" + bestProvider);
		printProvider(bestProvider);

		// if(bestProvider == null)
		{
			gpsProvider = LocationManager.GPS_PROVIDER;
			bestProvider = gpsProvider;
		}
	}

	protected void onResume()
	{
		locationManager.requestLocationUpdates(bestProvider, MINTIME, MINDISTANCE, this);
	}

	protected void onPause()
	{
		locationManager.removeUpdates(this);
	}

	
	public void onLocationChanged(Location location)
	{

		if (location == null)
			return;

		printLocation(location);

		this.location = location;

		if (listener != null)
		{
			listener.onLocationChanged(location);
		}
	}

	public void onProviderDisabled(String provider)
	{
		Log.e(tag, "onProviderDisabled:  " + provider);
	}

	public void onProviderEnabled(String provider)
	{
		Log.e(tag, "onProviderEnabled:  " + provider);
	}

	public void onStatusChanged(String provider, int status, Bundle extras)
	{
		Log.e(tag, "onStatusChanged:  " + provider + "," + status);
	}

	private void printLocation(Location location)
	{
		if (location == null)
		{
			Log.e(tag, "Location[unknown]");
		}
		else
		{
			Log.e(tag, "" + location.getSpeed());
			Log.e(tag, "" + location.getLongitude());
			Log.e(tag, "" + location.getLatitude());
		}
	}

	private void printProvider(String provider)
	{
		LocationProvider info = locationManager.getProvider(provider);
		StringBuilder builder = new StringBuilder();
		builder.append("LocationProvider[").append("name=").append(info.getName()).append(",enabled=").append(locationManager.isProviderEnabled(provider)).append(",getAccuracy=")
				.append(info.getAccuracy()).append(",getPowerRequirement=").append(info.getPowerRequirement()).append(",hasMonetaryCost=").append(info.hasMonetaryCost()).append(",requiresCell=")
				.append(info.requiresCell()).append(",requiresNetwork=").append(info.requiresNetwork()).append(",requiresSatellite=").append(info.requiresSatellite()).append(",supportsAltitude=")
				.append(info.supportsAltitude()).append(",supportsBearing=").append(info.supportsBearing()).append(",supportsSpeed=").append(info.supportsSpeed()).append("]");
		Log.e(tag, builder.toString());
	}
}
